package servlet;

import entity.Utente;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import session.MailUtilRemote;
import session.UtenteFacadeRemote;
import static servlet.ServletUtil.*;

/**
 * Questa servlet si occupa di gestire il login/logout degli utenti.
 *
 * @author Rachid Ouchary, Fabio Strocco, Max Passaghe, Marco Tansini.
 */
public class GestoreLogin extends HttpServlet {
    @EJB(name = "mailUtil")
    private MailUtilRemote mailUtil;
    @EJB
    private UtenteFacadeRemote utenteFacade;

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String operation = getOperation(request);

        if (operation.equals(ACTION_LOGIN)) {
            login(request, response,
                  request.getParameter(PARAM_USERNAME),
                  request.getParameter(PARAM_PASSWORD));
        } else if (operation.equals(ACTION_LOGOUT)) {
            logout(request, response);
        } else if (operation.equals(ACTION_REGISTRAZIONE)) {
            creaUtente(request, response,
                       request.getParameter(PARAM_USERNAME),
                       request.getParameter(PARAM_PASSWORD),
                       request.getParameter(PARAM_NOME),
                       request.getParameter(PARAM_COGNOME),
                       request.getParameter(PARAM_CITTA),
                       request.getParameter(PARAM_PROFESSIONE),
                       request.getParameter(PARAM_MAIL));
        } else if (operation.equals(ACTION_GET_MODIFICA_UTENTE)) {
            getModificaUtente(request, response);
        } else if (operation.equals(ACTION_MODIFICA_UTENTE)) {
            modificaUtente(request, response,
                       request.getParameter(PARAM_PASSWORD),
                       request.getParameter(PARAM_NOME),
                       request.getParameter(PARAM_COGNOME),
                       request.getParameter(PARAM_CITTA),
                       request.getParameter(PARAM_PROFESSIONE),
                       request.getParameter(PARAM_MAIL));
        }

    }

    // <editor-fold defaultstate="collapsed" desc="Eventi gestiti dal controller">
    /**
     * Effettua il login di un utente.
     *
     * @param username lo username dell'utente.
     * @param password la password dell'utente.
     */
    private void login(HttpServletRequest request, HttpServletResponse response,
                       String username, String password) throws IOException, ServletException {
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        Utente utente = utenteFacade.carica(username, password);

        if(utente == null) {
             request.setAttribute("error", true);
             request.getRequestDispatcher("index.jsp").forward(request, response);
        } else {
             session.setAttribute(SESSION_UTENTE, utente.getUsername());
             request.setAttribute("operation", ACTION_VISUALIZZA_WISHLIST);
             request.getRequestDispatcher("MainDispatcher").forward(request, response);
        }

    }

    /**
     * Esegue il logout.
     */
    private void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.removeAttribute(SESSION_UTENTE);
        request.getRequestDispatcher("index.jsp").forward(request, response);
    }

    /**
     * Crea un nuovo utente.
     *
     * @param username lo username dell'utente.
     * @param password la password dell'utente.
     * @param nome il nome dell'utente.
     * @param cognome il cognome dell'utente.
     * @param citta la citt&agrave dell'utente.
     * @param professione la professione dell'utente.
     * @param mail la mail dell'utente.
     */
    private void creaUtente(HttpServletRequest request, HttpServletResponse response,
                           String username, String password, String nome, String cognome,
                           String citta, String professione, String mail) throws IOException, ServletException {
        PrintWriter out = response.getWriter();
        Utente utente = new Utente(username, password, nome, cognome, citta,
                                   professione, mail);

        if(utenteFacade.exists(utente)) {
            request.setAttribute(PARAM_ERROR, "Username gi&agrave esistente");
            request.getRequestDispatcher("Registrazione.jsp").forward(request, response);
        } else {
            utenteFacade.create(utente);
            mailUtil.sendRegistrationMail(utente);
            //login(request, response, utente.getUsername(), utente.getPassword());
            request.setAttribute(PARAM_MESSAGE, "Regitrazione avvenuta con successo. Verr&agrave " +
                    "                            inviata un email di conferma con i dati del suo account.");
            request.getRequestDispatcher("Message.jsp").forward(request, response);
        }
    }

    /**
     * Modifica i dati dell'utente della sessione corrente.
     *
     * @param password la password dell'utente.
     * @param nome il nome dell'utente.
     * @param cognome il cognome dell'utente.
     * @param citta la citt&agrave dell'utente.
     * @param professione la professione dell'utente.
     * @param mail la mail dell'utente.
     */
    private void modificaUtente(HttpServletRequest request, HttpServletResponse response,
                                String password, String nome, String cognome,
                                String citta, String professione, String mail) throws IOException, ServletException {

        HttpSession session = request.getSession();
        Utente user = utenteFacade.find((String) session.getAttribute(SESSION_UTENTE));

        user.setPassword(password);
        user.setNome(nome);
        user.setCognome(cognome);
        user.setCitta(citta);
        user.setProfessione(professione);
        user.setMail(mail);
        utenteFacade.edit(user);
        request.setAttribute("operation", ACTION_VISUALIZZA_WISHLIST);
        request.getRequestDispatcher("MainDispatcher").forward(request, response);
    }

    /**
     * Richiama la pagina di modifica dei dati dell'utente.
     */
    private void getModificaUtente(HttpServletRequest request, HttpServletResponse response)
                                                               throws ServletException, IOException {
        HttpSession session = request.getSession();
        Utente user = utenteFacade.find((String) session.getAttribute(SESSION_UTENTE));
        request.setAttribute(PARAM_UTENTE, user);
        request.getRequestDispatcher("GestioneProfilo.jsp").forward(request, response);
    }

    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
